2005年11月02日
川俣晶の縁側ソフトウェア技術雑記 total 5106 count

ブラウザ間非互換性: Safari2において、location.hashの書き換えで発生するリロードと終わらない読み込み中

Written By: 川俣 晶連絡先

 Safari2において、location.hashの書き換えで、2種類の意図せざる挙動を見せることを確認しました。

 1つは、ページがリロードされ、onLoadイベントが再発生すること。

 もう1つは、終わらない「読み込み中」の表示状態になることです。

再現プログラム §

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">

<title>test</title>

</head>

<body onload="alert('onload');">

<input type="button" onclick="location.hash = 'A';" 

value="hashの'A'への書き換え"></input>

<input type="button" onclick="location.hash = 'B';" 

value="hashの'B'への書き換え"></input>

</body>

</html>

 このページをSafari2(412.2)にて開くと以下のような症状が発生しました。

  • その時点でアドレス欄に入っているURLの末尾が"#A"ではないとき、"hashの'A'への書き換え"ボタンをクリックすると、ウィンドウのタイトルバーに「"test"を読み込み中」という表示が出たままになり、そのまま何も起こらない
  • その時点でアドレス欄に入っているURLの末尾が"#B"ではないとき、"hashの'B'への書き換え"ボタンをクリックすると、ウィンドウのタイトルバーに「"test"を読み込み中」という表示が出たままになり、そのまま何も起こらない
  • その時点でアドレス欄に入っているURLの末尾が"#A"のとき、"hashの'A'への書き換え"ボタンをクリックすると、"onload"というメッセージが表示され、onLoadイベントが実行されたことを示す
  • その時点でアドレス欄に入っているURLの末尾が"#B"のとき、"hashの'B'への書き換え"ボタンをクリックすると、"onload"というメッセージが表示され、onLoadイベントが実行されたことを示す

 ちなみに、Inrernet Explorer, Firefox, Operaでは、"onload"というメッセージが表示されるのは、ページを開いた最初の1回だけです。ボタンを押すことに対応して表示されることはありません。また、読み込み中のまま何も起こらないという現象もありません。

回避方法 §

 onLoadイベントを実行させない方法は簡単です。同じ値への書き換えを発生させなければ良いのです。つまり、同じ値の場合は、そもそもlocation.hashに代入する必要がないわけで、条件判断をさせて代入しないようにすれば良いはずです。

 しかし、読み込み中の表示がいつまでも続く問題については、回避するための上手いアイデアがありません。

 もしも、誰かが私に良いアイデアを教えることができない場合、Safariではlocation.hashへの代入は使えないという結論になるかもしれません。